package firewallConfig

import firewall.*

class ReglaBuilder {
	
	def ReglaCompuesta reglaCompuesta = new ReglaCompuesta();
	
	final static ORIGEN = "Origen";
	final static DESTINO = "Destino";
	private filtro, tipo, negadora, inicio, fin, nombreRegla
	
	public ip(_tipo) {
		
		generarRegla();
		filtro = "Ip";
		tipo = _tipo.toUpperCase();
		this
	}
	public puerto(_tipo) {
		
		generarRegla();
		filtro = "Puerto";
		tipo = _tipo.toUpperCase();
		this
	}
	public abrir(ippuerto) {
		generarRegla();
		negadora = false;
		inicio = ippuerto;
		this
	}
	public bloquear(ippuerto) {
		generarRegla();
		negadora = true;
		inicio = ippuerto;
		this
	}
	public a(ippuerto) {
		
		fin = ippuerto;
		
		this
	}
	public loguear(path) {
		
		generarRegla();
		AccionLog accion = new AccionLog(new ArchivoLog(path,""));
		
		for(Regla regla : reglaCompuesta.reglas)
			regla.agregarAccion(accion);
			
		this
	}
	public forward(ip_destino, puerto_destino) {
		
		generarRegla();
		AccionForward accion = new AccionForward(ip_destino, puerto_destino);
		
		for(Regla regla : reglaCompuesta.reglas)
			regla.agregarAccion(accion);
		
		this
	}
	
	private generarRegla() {
		
		// Si no hay opciones seteadas para generar la regla, no hace nada.
		if(inicio == null)
			return;
		
		// Si no paso por el metodo "a", tiene que terminar de setear el tipo de filtro
		if(fin == null)
			nombreRegla = "reglaEspecifica"+filtro;
		else
			nombreRegla = "reglaGeneral"+filtro;
		
		reglaCompuesta.agregarRegla(this."$nombreRegla"());
		
		inicio = null;
		fin = null;
	}
	
	private reglaEspecificaIp() {
		
		ReglaEspecificaIp regla = new ReglaEspecificaIp();
		regla.setSosNegadora(negadora);
		regla.setIp(inicio);
		
		regla
	}
	
	private reglaEspecificaPuerto() {
		
		ReglaEspecificaPuerto regla = new ReglaEspecificaPuerto();
		regla.setSosNegadora(negadora);
		regla.setPuerto(inicio);
		
		regla
		
	}
	
	private reglaGeneralIp() {
		
		ReglaGeneralIp regla = new ReglaGeneralIp();
		regla.setSosNegadora(negadora);
		def tipoReal = this."$tipo";
		regla."setIp${tipoReal}Piso"(inicio);
		regla."setIp${tipoReal}Techo"(fin);
		
		regla
		
	}
	
	private reglaGeneralPuerto() {
		
		ReglaGeneralPuerto regla = new ReglaGeneralPuerto();
		regla.setSosNegadora(negadora);
		regla.setPuertoPiso(inicio);
		regla.setPuertoTecho(fin);
		
		regla
	}
	
	public build() {
		generarRegla();
		reglaCompuesta
	}
	
}

